package com.xcm.service;

import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.Page;
import com.xcm.exception.ServiceException;
import com.xcm.export.entity.SingleProgramDetailReportData;
import com.xcm.model.TbProgramJson;
import com.xcm.model.dto.AuthProgramJsonDTO;
import com.xcm.model.dto.ProgramJsonListDTO;
import com.xcm.model.vo.ProgramJsonStatVO;
import com.xcm.model.vo.SingleProgramDetailReportVO;
import com.xcm.model.vo.WholeProgramReportVO;
import com.xcm.page.PageInfo;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;

/**
 * 节目JsonService
 */
public interface ProgramJsonService {
	/**
	 * 发布节目
	 * publishProgram
	 *
	 * @param version 版本号
	 * @param url     Json文件下载地址
	 * @param request HttpServletRequest
	 */
	String publishProgram(String version, String url, HttpServletRequest request) throws UnsupportedEncodingException, ServiceException;

	/**
	 * 保存节目Json
	 * saveProgramJson
	 *
	 * @param programJson TbProgramJson类型对象
	 */
	void saveProgramJson(TbProgramJson programJson);

	/**
	 * 获取节目Json列表(分页)
	 * listProgramJsonByPage
	 *
	 * @param timeType        筛选时间类型称
	 * @param startTime       筛选时间-开始
	 * @param endTime         筛选时间-结束
	 * @param deviceDownState 终端下载状态
	 * @param checkType       校验状态
	 * @param publishId       发布Id
	 * @param pageNum         当前页
	 * @param pageSize        每页显示条数
	 * @return Page<ProgramJsonListDTO>
	 */
	Page<ProgramJsonListDTO> listProgramJsonByPage(String timeType, String startTime, String endTime, String deviceDownState, String checkType, Long publishId, Integer pageNum, Integer pageSize);

	/**
	 * 通过xc版本获取节目Json
	 * getProgramInfoByXcVersion
	 *
	 * @param xcVersion xc版本号
	 * @return TbProgramInfo
	 */
	TbProgramJson getProgramJsonByXcVersion(String xcVersion);

	/**
	 * 获取终端下载广告成功数量（所有终端下载完毕该批次广告，成功数量+1,多一个终端对应一批广告，有一个失败即失败数+1）
	 *
	 * @return Long
	 */
	Long getProgramJsonConutByDeviceDownState(Integer state);

	/**
	 * 根据下载云端推送广告状态获取广告数量
	 *
	 * @return Long
	 */
	Long getProgramJsonCountByDownloadState(Integer state);

	/**
	 * 获取节目相关统计信息
	 *
	 * @return Long
	 */
	ProgramJsonStatVO getProgramJsonStat();

	/**
	 * 获取单个节目详细报表列分页表
	 *
	 * @param receiveStartTime 接收开始时间
	 * @param receiveEndTime   接收结束时间
	 * @param programJsonId    节目主键ID
	 * @param pageNum          当前页
	 * @param pageSize         每页多少条
	 * @return PageInfo<SingleProgramDetailReportVO>
	 */
	PageInfo<SingleProgramDetailReportVO> listSingleProgramDetailReportByPage(String receiveStartTime, String receiveEndTime, Long programJsonId, Integer pageNum, Integer pageSize);

	/**
	 * 获取导出单个节目详细报表列表
	 *
	 * @param receiveStartTime 接收开始时间
	 * @param receiveEndTime   接收结束时间
	 * @param programJsonId    节目主键ID
	 * @return List<SingleProgramDetailReportData>
	 */
	List<SingleProgramDetailReportData> listExportSingleProgramDetailReport(String receiveStartTime, String receiveEndTime, Long programJsonId);

	/**
	 * 获取广告校验失败数
	 *
	 * @return Long
	 */
	Long getProgramJsonAuthFailureCount();

	/**
	 * 获取广告发布失败数量
	 *
	 * @return Long
	 */
	Long getProgramJsonPublishFailureCount();

	/**
	 * 获取广告总数
	 *
	 * @return Long
	 */
	Long getProgramJsonCount();

	/**
	 * 获取整体广告分页列表
	 *
	 * @param timeType      1:接收时间 2:完成时间
	 * @param startTime     开始时间
	 * @param endTime       结束时间
	 * @param publishWay    发布方式 1：定时发布(当前只有定时发布) 2:预约发布
	 * @param programJsonId 发布Id
	 * @param pageNum       当前页数
	 * @param pageSize      每页条数
	 * @return
	 */
	PageInfo<WholeProgramReportVO> listWholeProgramReportByPage(Integer timeType, String startTime, String endTime, Integer publishWay, Long programJsonId, Integer pageNum, Integer pageSize);

	/**
	 * TODO 通过导入json文件发布广告
	 *  @param version 版本
	 * @param file    json文件
     * @param user
     * @param request
     */
	void publishProgramByJsonFile(String version, MultipartFile file, JSONObject user, HttpServletRequest request) throws IOException;

	/**
	 * 获取整体广告列表
	 *
	 * @param timeType      1:接收时间 2:完成时间
	 * @param startTime     开始时间
	 * @param endTime       结束时间
	 * @param publishWay    发布方式 1：定时发布(当前只有定时发布) 2:预约发布
	 * @param programJsonId 发布Id
	 * @return
	 */
	List<WholeProgramReportVO> listWholeProgramReport(Integer timeType, String startTime, String endTime, Integer publishWay, Long programJsonId);

	/**
	 * 获取校验未校验节目json
	 *
	 * @return List<AuthProgramJsonDTO>
	 */
	List<AuthProgramJsonDTO> listAuthNoPassProgramJson();

	/**
	 * 通过xc版本更新节目校验状态
	 *
	 * @param jsonAuth  校验状态
	 * @param xcVersion xc版本
	 */
	void updateProgramJsonAuthByXcVersion(Integer jsonAuth, String xcVersion);
}
